package com.yuju.login.service.impl;

import java.util.Date;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.yuju.common.core.dao.IBaseDao;
import com.yuju.common.core.service.AbstractBaseService;
import com.yuju.exception.BusinessException;
import com.yuju.login.dao.IRoleDao;
import com.yuju.login.dao.entity.Role;
import com.yuju.login.enums.RoleReturnCodeEnum;
import com.yuju.login.model.OpModel;
import com.yuju.login.model.RoleMenuModel;
import com.yuju.login.model.RoleModel;
import com.yuju.login.service.IOpService;
import com.yuju.login.service.IRoleMenuService;
import com.yuju.login.service.IRoleService;
import com.yuju.util.Utils;
/**
 * 
 * 类名：RoleServiceImpl  <br />
 *
 * 功能：
 *
 * @author : zhousc <br />
 * @Date : 2017年11月27日 上午10:34:24  <br />
 * @version : 1.1 <br />
 */
@Service
public class RoleServiceImpl extends AbstractBaseService<RoleModel, Role, String> implements IRoleService{

	@Autowired
	private IRoleDao roleDao;
	@Autowired 
	private IRoleMenuService roleMenuService;
	@Autowired
	private IOpService opService;
	
	@Override
	public IBaseDao<RoleModel, Role, String> getDao() {
		// TODO Auto-generated method stub
		return roleDao;
	}

	/**
	 * 
	 * 功能: <br/>
	 * 
	 * 重写：zhousc <br/>
	 * 
	 * @Date ：2017年12月4日 上午10:53:13<br/>
	 * 
	 * @param roleModel
	 * @return <br/>
	 * @see com.yuju.common.core.service.AbstractBaseService#save(java.lang.Object)
	 */
	@Override
	public int save(RoleModel roleModel){
		//角色信息添加
		roleModel.setId(Utils.getUUID());
		roleModel.setGmtCreate(new Date());
		roleModel.setGmtModified(new Date());
		this.getDao().saveSelective(roleModel);
		//添加角色菜单权限
		RoleMenuModel roleMenuModel = new RoleMenuModel();
		roleMenuModel.setRoleId(roleModel.getId());
		roleMenuModel.setMenuIds(roleModel.getMenuIds());
		roleMenuService.save(roleMenuModel);
		return 1;
	}
	
	/**
	 * 
	 * 功能: <br/>
	 * 
	 * 重写：zhousc <br/>
	 * 
	 * @Date ：2017年12月4日 上午10:53:15<br/>
	 * 
	 * @param roleModel
	 * @return <br/>
	 * @see com.yuju.common.core.service.AbstractBaseService#updateSelective(java.lang.Object)
	 */
	@Override
	public int updateSelective(RoleModel roleModel){
		roleModel.setGmtModified(new Date());
		//修改角色信息
		this.getDao().updateSelective(roleModel);
		RoleMenuModel roleMenuModel = new RoleMenuModel();
		roleMenuModel.setRoleId(roleModel.getId());
		roleMenuModel.setMenuIds(roleModel.getMenuIds());
		roleMenuService.updateSelective(roleMenuModel);
		return 1;
	}
	
	/**
	 * 
	 * 功能: 根据ID获取角色信息<br/>
	 * 
	 * 重写：zhousc <br/>
	 * 
	 * @Date ：2017年12月4日 下午3:24:52<br/>
	 * 
	 * @param id
	 * @return <br/>
	 * @see com.yuju.common.core.service.AbstractBaseService#findById(java.lang.Object)
	 */
	@Override
	public RoleModel findById(String id){
		//查询角色信息
		RoleModel roleModel = convert(this.getDao().getObj(id));
		//查询角色权限
		RoleMenuModel roleMenuModel = new RoleMenuModel();
		roleMenuModel.setRoleId(id);
		List<RoleMenuModel> roleMenuModels = roleMenuService.list(roleMenuModel);
		//list转数组
		String[] strings = new String[roleMenuModels.size()];
		for (int i=0;i<roleMenuModels.size();i++){
            strings[i]=roleMenuModels.get(i).getMenuId();
        }
		roleModel.setMenuIds(strings);
		return roleModel;
	}

	/**
	 * 
	 * 功能:删除角色时删除rolemenu表里相关数据 <br/>
	 * 
	 * 重写：zhousc <br/>
	 * 1.查询对应账号信息
	 * 2.如有该角色的账号，则提示不可删除
	 * 3.如果没有，则删除指定的角色，并且删除该角色下的菜单数据
	 * @Date ：2017年12月4日 下午5:03:58<br/>
	 * 
	 * @param id
	 * @return <br/>
	 * @see com.yuju.common.core.service.AbstractBaseService#del(java.lang.Object)
	 */
	@Override
	public int del(String id){
		OpModel param = new OpModel();
		param.setRoleId(id);
		// 1.查询对应账号信息
		Integer rows = opService.getCount(param);
		// 2.如有该角色的账号，则提示不可删除
		if (Utils.isNotNull(rows) && rows > 0) {
			throw new BusinessException(RoleReturnCodeEnum.ROLE_DEL_FAILURE_BY_OP.getCode(), 
					RoleReturnCodeEnum.ROLE_DEL_FAILURE_BY_OP.getDesc());
		}
		// 3.如果没有，则删除指定的角色，并且删除该角色下的菜单数据
		rows = super.del(id);
		if (rows > 0) {
			roleMenuService.del(id);
		}
		return rows;
	}
	/**
	 * 
	 * 功能：重名验证<br/>
	 *
	 * @author zhousc
	 * @Date 2017年12月13日 下午4:26:32 <br/>
	 */
	@Override
	public boolean selectByName(RoleModel roleModel) {
		// TODO Auto-generated method stub
		//定义返回值
		boolean result = false;
		//装载数据查询数据库
		RoleModel model = new RoleModel();
		model.setName(roleModel.getName());
		model.setGroupId(roleModel.getGroupId());
		
		//修改时验证重名
		if (Utils.isNotNull(roleModel.getId())) {
			RoleModel roleModel1 = convert(this.getDao().getObj(roleModel.getId()));
			if (roleModel.getName().equals(roleModel1.getName())) {
		            result = true;
		        } else {
		       	 	Map<Object, Object> beanMap = getBeanMap(model);
		            List<RoleModel> list = this.getDao().list(beanMap);
		            if (list.size() == 0) {
		                result = true;
		            }
		        }
		//新增验证重名
		}else {
			Map<Object, Object> beanMap = getBeanMap(model);
		        List<RoleModel> list = this.getDao().list(beanMap);
		        if (list.size() == 0) {
		            result = true;
		        }
		    }
		return result;
	}
}
